<?php

  /**
   * CommentsController
   *
   * Класс контроллера для работы с комментариями
   */

  final class CommentsController extends XMLController
  {
    /**
     * предопределенные действия
     *
     * @return array
     * @access public
     */
    public function actions()
    {
      return array("getlast" => "AjaxAction", "add" => "AjaxAction") + parent::actions();
    }

    /**
     * Action отобразить последний комментарий
     *
     * @param int $pid идентификатор поста
     * @return void
     * @access public
     */
    public function actionGetLast($pid)
    {
      /** @var $post Post */
      $post = $pid ? Post::model()->findByPk($pid) : null;
      /** @var $comments Comment[] */
      if ($post)
      {
        $comments = $post->commentaries;
        if ($last = $post->last_comment)
        {
          $lcStamp = $post->lc_stamp;
          if (empty($comments) || ($comments[0]->stamp < $lcStamp))
          {
            /** @var $comment Comment */
            $comment = new Comment();
            $comment->setAttributes(array(
              "comment" => CHtml::tag("p", array(), $last),
              "table"   => $post->tableName(),
              "rec_id"  => $post->id,
              "stamp"   => $post->lc_stamp
            ));
            $comments = array($comment);
          }
        }
      }

      $this->runPreAction(array(
        "view" => "comment",
        "xsl"  => $this->action->id,
        "data" => array("comment" => empty($comments) ? null : $comments[0])
      ));
    }

    /**
     * Action сохранить последний комментарий
     *
     * $_POST == array(
     *   "pid"     => идентификатор поста,
     *   "count"   => кол-во комментариев,
     *   "comment" => "текст",
     *   "date"    => дата создания
     * )
     *
     * @return void
     * @access public
     */
    public function actionSetLast()
    {
      /** @var $post Post */
      $post = Post::model()->findByPk($this->getParam("pid"));
      if ($response = !!$post)
        if ($this->getParam("count"))
        {
          $comment = $this->getParam("comment");
          if ($response = !!$comment)
          {
            $stamp = date("Y-m-d H:i:s");
            if ($date = $this->getParam("date"))
              if (is_numeric($date))
                $stamp = date("Y-m-d H:i:s", $date);
              else
              {
                preg_match("/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})([-+])(\d{2}):(\d{2})$/", $date, $matches);
                if (!empty($matches))
                {
                  list($date, $year, $month, $day, $h, $m, $s) = $matches;
                  $stamp = "$year-$month-$day $h:$m:$s";
                }
              }
            $response = $post->saveAttributes(array("last_comment" => $comment, "lc_stamp" => $stamp));
          }
        }
        else
          $response = $post->saveAttributes(array("last_comment" => null, "lc_stamp" => null));
      self::responseBool($response);
    }

    /**
     * Action добавить комментарий
     *
     * $_POST == array(
     *   "comment" => "текст",
     *   "table"   => "имя таблицы, для записи которой добавляется комментарий",
     *   "rec_id"  => идентификатор записи, для которой добавляется комментарий
     * )
     *
     * @return void
     * @access public
     */
    public function actionAdd()
    {
      $this->checkAccess("add_comment");

      $comment             = new Comment();
      $comment->attributes = $this->getParam("comment");

      WebApplication::validate($comment->save(), 500, "Не удалось создать комментарий");

      $this->runPreAction(array("view" => "comment", "data" => array("comment" => $comment)));
    }

    /**
     * Action удалить комментарий
     *
     * $_POST == array("id" => идентификатор комментария)
     *
     * @return void
     * @access public
     */
    public function actionRemove()
    {
      WebApplication::validate($id = $this->getParam("id"));
      /** @var $comment Comment */
      WebApplication::validate($comment = Comment::model()->findByPk($id), 500, "Комментарий не найден");

      $this->checkAccess("remove_comment", true, array("comment" => $comment));
      self::responseBool($comment->sentencedInvert());
    }
  }

?>
